home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / demo / ns2demo1.zip / 32SINST.MST < prev    next >
Text File  |  1995-03-24  |  22KB  |  648 lines

  1. '**************************************************************************
  2. '*                  Script for NeuroSolutions setup program
  3. '**************************************************************************
  4.  
  5. '' $DEFINE DEBUG  ''Define for script development/debugging
  6.  
  7. '$INCLUDE 'setupapi.inc'
  8. '$INCLUDE 'msdetect.inc'
  9.  
  10. ''Dialog ID's
  11. CONST WELCOME                  = 100
  12. CONST ASKQUIT                  = 200
  13. CONST DESTPATH                 = 300
  14. CONST EXITFAILURE              = 400
  15. CONST EXITQUIT                 = 600
  16. CONST EXITSUCCESS              = 700
  17. CONST OPTIONS                  = 800
  18. CONST BADPATH                  = 6400
  19.  
  20. CONST HELPWELCOME              = 1000
  21. CONST VERPATH                  = 1100
  22. CONST EXITFAILNOTWIN31         = 1200
  23. CONST EXITFAILNOTENH           = 1300
  24. CONST EXITFAILNOTPAGING        = 1325
  25. CONST EXITFAILNOTINTEL         = 1350
  26. CONST EXITFAILRUNAPP           = 1360
  27. CONST FREECELLINST             = 1400
  28. CONST FREECELLINSTNOWIN32S     = 1450
  29. CONST FREECELLPATH             = 1500
  30. CONST HELPFREECELL             = 1600
  31.  
  32.  
  33. ''Bitmap ID
  34. CONST LOGO = 1
  35.  
  36. GLOBAL DESTSYS$      ''Windows\System directory.
  37. GLOBAL DEST32S$      ''Windows\System\Win32s directory
  38. GLOBAL DESTFREE$     ''NeuroSolutions directory
  39. GLOBAL OLE_PROTECT%  ''Indicates whether ole2 dlls were protected from being
  40.                      '' copied.
  41.  
  42. DECLARE SUB Install(OLEONLY%, OLE2_32%, OLE2_16%, OLE2AUTO_16%, OLE16RUNAPP%)
  43. DECLARE SUB UpdateSystemIni
  44. DECLARE FUNCTION RebootSystem(OLEONLY%) AS INTEGER
  45. DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING
  46. DECLARE FUNCTION MakeSystemIni LIB "INIUPD.DLL" (arg1$, arg2$) AS INTEGER
  47. DECLARE FUNCTION RestartWindows LIB "INIUPD.DLL" AS INTEGER
  48. DECLARE FUNCTION OnWindowsNT LIB "INIUPD.DLL" AS INTEGER
  49. DECLARE FUNCTION PagingEnabled LIB "INIUPD.DLL" AS INTEGER
  50. DECLARE FUNCTION ShareEnabled LIB "INIUPD.DLL" AS INTEGER
  51. DECLARE FUNCTION IsWin32sLoaded LIB "INIUPD.DLL" (arg1$) AS INTEGER
  52. DECLARE FUNCTION IsRunningApp LIB "INIUPD.DLL" AS INTEGER
  53. DECLARE FUNCTION SetCuiFlags LIB "MSCUISTF.DLL" (arg1%, arg2%) AS INTEGER
  54. DECLARE FUNCTION ExitWindowsExec LIB "USER.EXE" (arg1$, arg2$) AS INTEGER
  55. DECLARE FUNCTION GetModuleHandle LIB "KRNL386.EXE" (arg1$) AS INTEGER
  56. DECLARE FUNCTION LoadLibrary LIB "KRNL386.EXE" (arg1$) AS INTEGER
  57. DECLARE SUB FreeLibrary LIB "KRNL386.EXE" (arg1%)
  58. DECLARE FUNCTION SetErrorMode LIB "KRNL386.EXE" (arg1%) AS INTEGER
  59.  
  60. INIT:
  61.     CUIDLL$ = "mscuistf.dll"            '' Custom user interface dll
  62.     HELPPROC$ = "FHelpDlgProc"          '' Help dialog procedure
  63.     szOldVer$ ="1.00.000     "          '' Reserve space in string for version
  64.     WIN32ENABLED% = 0
  65.     OLEONLY% = 0
  66.     OLE2_16% = 0
  67.     OLE2AUTO_16% = 0
  68.     OLE16RUNAPP% = 0
  69.     OLE_PROTECT% = 0
  70.  
  71.     ON ERROR GOTO ERRNORMAL
  72.  
  73.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  74.  
  75.     szInf$ = GetSymbolValue("STF_SRCINFPATH")
  76.     IF szInf$ = "" THEN
  77.         szInf$ = GetSymbolValue("STF_CWDDIR") + "32sinst.inf"
  78.     END IF
  79.     ReadInfFile szInf$
  80.  
  81.     SetBitmap CUIDLL$, LOGO
  82.     SetTitle "NeuroSolutions Setup Program"
  83. '**  SetTitle "Microsoft Win32s (v" + MID$(GetSectionKeyVersion("WindowsSystem", "win32s16"), 1, 4) + ") and NeuroSolutions Setup Program"
  84.  
  85.     DESTSYS$ = GetWindowsSysDir()
  86.     DEST32S$ = DESTSYS + "WIN32S\"
  87.  
  88. '$IFDEF DEBUG
  89.     i% = SetSizeCheckMode(scmOnIgnore)    '' could use scmOff; def = scmOnFatal
  90.     WinDrive$ = MID$(GetWindowsDir, 1, 1)
  91.     IF IsDriveValid(WinDrive$) = 0 THEN
  92.         i% = DoMsgBox("Windows drive ('"+WinDrive$+"') is not a valid drive.", "DEBUG", MB_TASKMODAL+MB_ICONHAND+MB_OK)
  93.         GOTO QUIT
  94.     END IF
  95. '$ENDIF ''DEBUG
  96.  
  97. CHECK:
  98.     '' Can not run on versions less than 3.10.
  99.     IF GetWindowsMajorVersion < 3 THEN
  100.         ExitCode% = EXITFAILNOTWIN31
  101.         GOTO QUIT
  102.     END IF
  103.     IF GetWindowsMajorVersion = 3 AND GetWindowsMinorVersion < 10 THEN
  104.         ExitCode% = EXITFAILNOTWIN31
  105.         GOTO QUIT
  106.     END IF
  107.     '' Check that we are not runnig on Chicago, including pre-released
  108.     '' Chicago versions.
  109.     IF GetWindowsMajorVersion * 100 + GetWindowsMinorVersion > 350 THEN
  110.         ExitCode% = EXITSUCCESS
  111.         WIN32ENABLED% = 1
  112.         GOTO FREECELL
  113.     END IF
  114.     IF GetWindowsMode < 2  THEN
  115.         IF OnWindowsNT() THEN
  116.             ExitCode% = EXITFAILNOTINTEL '' Running on Windows NT (on RISC)
  117.         ELSE
  118.             ExitCode% = EXITFAILNOTENH   '' Standard Mode Windows
  119.         END IF
  120.         GOTO QUIT
  121.     END IF
  122.     IF OnWindowsNT() THEN
  123.         ExitCode% = EXITSUCCESS
  124.         WIN32ENABLED% = 1
  125.         GOTO FREECELL
  126.     END IF
  127.     ExitCode% = EXITSUCCESS
  128.  
  129.     if IsRunningApp() <> 0 THEN
  130.         ExitCode% = EXITFAILRUNAPP
  131.         GOTO QUIT
  132.     END IF
  133.  
  134.     '' Get version of Win32s to be installed from version info in INF file
  135.     szNewVer$ = GetSectionKeyVersion("WindowsSystem", "win32s16")
  136.  
  137.     '' See if OLE is included.
  138.  
  139.     OLEINCLUDED% = DoesFileExist( GetSymbolValue("STF_SRCDIR") + "OLE2THK.DL_", femExists )
  140.  
  141.     IF OLEINCLUDED% = 1 THEN
  142.         '' See whether one of the OLE 16 bit components is loaded.
  143.         IF GetModulehandle("compobj") <> 0 THEN
  144.             OLE16RUNAPP% = 1
  145.             GOTO GetOleVersion
  146.         END IF
  147.         IF GetModuleHandle("ole2") <> 0 THEN
  148.             OLE16RUNAPP% = 1
  149.             GOTO GetOleVersion
  150.         END IF
  151.         IF GetModuleHandle("ole2prox") <> 0 THEN
  152.             OLE16RUNAPP% = 1
  153.             GOTO GetOleVersion
  154.         END IF
  155.         IF GetModuleHandle("ole2conv") <> 0 THEN
  156.             OLE16RUNAPP% = 1
  157.             GOTO GetOleVersion
  158.         END IF
  159.         IF GetModuleHandle("storage") <> 0 THEN
  160.             OLE16RUNAPP% = 1
  161.             GOTO GetOleVersion
  162.         END IF
  163.         IF GetModuleHandle("ole2nls") <> 0 THEN
  164.             OLE16RUNAPP% = 1
  165.             GOTO GetOleVersion
  166.         END IF
  167.         IF GetModuleHandle("ole2disp") <> 0 THEN
  168.             OLE16RUNAPP% = 1
  169.             GOTO GetOleVersion
  170.         END IF
  171.         IF GetModuleHandle("typelib") <> 0 THEN
  172.             OLE16RUNAPP% = 1
  173.             GOTO GetOleVersion
  174.         END IF
  175.  
  176. GetOleVersion:
  177.         szOleNewVer$ = GetSectionKeyVersion("OleWindowsSystemWin32s", "ole2thk")
  178.  
  179.         '' Get version of currently installed OLE32 from version info of
  180.         '' ole2thk file
  181.         szOleOldVer$ = GetVersionOfFile( DESTSYS$ + "WIN32S\OLE2THK.DLL" )
  182.  
  183.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "COMPOBJ.DLL" )
  184.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "compobj")
  185.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  186.             OLE2_16% = 1
  187.         END IF
  188.  
  189.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2.DLL" )
  190.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2")
  191.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  192.             OLE2_16% = 1
  193.         END IF
  194.  
  195.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2PROX.DLL" )
  196.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2prox")
  197.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  198.             OLE2_16% = 1
  199.         END IF
  200.  
  201.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "STORAGE.DLL" )
  202.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "storage")
  203.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  204.             OLE2_16% = 1
  205.         END IF
  206.  
  207.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2CONV.DLL" )
  208.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2conv")
  209.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  210.             OLE2_16% = 1
  211.         END IF
  212.  
  213.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2NLS.DLL" )
  214.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2nls")
  215.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  216.             OLE2AUTO_16% = 1
  217.         END IF
  218.  
  219.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2DISP.DLL" )
  220.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2disp")
  221.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  222.             OLE2AUTO_16% = 1
  223.         END IF
  224.  
  225.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "TYPELIB.DLL" )
  226.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "typelib")
  227.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  228.             OLE2AUTO_16% = 1
  229.         END IF
  230.  
  231.     END IF
  232.  
  233.     OLE2_32% = 1
  234.  
  235.     '' Check if Win32s is partially installed
  236.     sz$ = GetIniKeyString (DESTSYS$ + "WIN32S.INI", "Win32s", "Setup")
  237.     '' If WIN32S.INI specifies Win32s Setup=0, then force complete Win32s file overwrite
  238.     IF sz$ = "0" THEN
  239.         GOTO WELCOME
  240.     END IF
  241.     '' If WIN32S.INI is missing, try and reinstall Win32s files/recreate WIN32S.INI
  242.     IF sz$ <> "1" THEN
  243.         GOTO WELCOME
  244.     END IF
  245.  
  246.     '' If Win32s is already installed, get running version number
  247.     i% = DoesFileExist( DESTSYS$ + "W32SYS.DLL", femExists )
  248.     IF i% = 1 THEN
  249.         i% = IsWin32sLoaded( szOldVer$ )
  250.     ENDIF
  251.  
  252.     IF i% = 0 THEN
  253.         GOTO WELCOME
  254.     END IF
  255.  
  256.     IF szNewVer$ > szOldVer$ THEN
  257.         GOTO WELCOME
  258.     END IF
  259.  
  260.     OLE2_32% = 0
  261.  
  262.     IF szNewVer$ = szOldVer$ AND OLEINCLUDED% = 1 THEN
  263.         '' Compare OLE32 version and versions of each of OLE16 libraries.
  264.         sz$ = GetIniKeyString (DESTSYS$ + "WIN32S.INI", "OLE", "Setup")
  265.         '' If WIN32S.INI specifies OLE2 Setup=0, then force OLE2 file overwrite
  266.         IF ((sz$ <> "1") OR (szOleNewVer$ > szOleOldVer$)) THEN
  267.             OLEONLY% = 1
  268.             OLE2_32% = 1
  269.             GOTO WELCOME
  270.         END IF
  271.  
  272.     IF OLE2_16% OR OLE2AUTO_16 THEN
  273.             OLEONLY% = 1
  274.             GOTO WELCOME
  275.         END IF
  276.  
  277.     END IF
  278.     WIN32ENABLED% = 1
  279.     GOTO FREECELL
  280.  
  281. WELCOME:
  282.     i% = SetCuiFlags(OLEONLY%, OLE16RUNAPP%)
  283.     sz$ = UIStartDlg(CUIDLL$, WELCOME, "FInfoDlgProc", HELPWELCOME, HELPPROC$)
  284.     IF sz$ = "CONTINUE" THEN
  285.         UIPop 1
  286.     ELSE
  287.         GOSUB ASKQUIT
  288.         GOTO WELCOME
  289.     END IF
  290.  
  291.  
  292. GETWIN32SPATH:
  293.     IF PagingEnabled() = 0 THEN
  294.         i% = DoMsgBox("Use the Control Panel 386 Enhanced icon and configure Windows using the Virtual Memory option.", "Win32s requires Virtual Memory", MB_TASKMODAL+MB_ICONHAND+MB_OK)
  295.         ExitCode% = EXITFAILURE '' Enhanced mode but not paging
  296.         GOTO QUIT
  297.     END IF
  298.  
  299.     IF ShareEnabled() = 0 THEN
  300.         i% = DoMsgBox( "File-sharing must be enabled. Run SHARE.EXE before starting Windows or add SHARE.EXE to your AUTOEXEC.BAT file.", "Win32s Setup: SHARE.EXE is not loaded", MB_TASKMODAL+MB_ICONEXCLAMATION+MB_OK)
  301.     END IF
  302.  
  303.     SetSymbolValue "EditTextIn", DESTSYS$
  304.     SetSymbolValue "EditFocus", "END"
  305.  
  306. GETPATHL1:
  307.     sz$ = UIStartDlg(CUIDLL$, VERPATH, "FDispDlgProc", HELPWELCOME, HELPPROC$)
  308.  
  309.     IF sz$ = "CONTINUE" THEN
  310.         IF IsDirWritable(DESTSYS$) = 0 THEN
  311.             GOSUB BADPATH
  312.             GOTO GETPATHL1
  313.         END IF
  314.         UIPop 1
  315.     ELSEIF sz$ = "REACTIVATE" THEN
  316.         GOTO GETPATHL1
  317.     ELSEIF sz$ = "BACK" THEN
  318.         UIPop 1
  319.         GOTO WELCOME
  320.     ELSE
  321.         GOSUB ASKQUIT
  322.         GOTO GETPATHL1
  323.     END IF
  324.  
  325. COPYFILES:
  326.     IF OLEONLY% = 0 THEN
  327.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Win32s", "Setup", "0", cmoOverwrite
  328.     END IF
  329.     IF OLE2_32% = 1 THEN
  330.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "OLE", "Setup", "0", cmoOverwrite
  331.     END IF
  332.  
  333.     '' Indicate Win32s install failure until all files known to be copied.
  334.     ExitCode% = EXITFAILURE
  335.     ERR = 0
  336.     CreateDir DEST32S$, cmoNone
  337.     Install OLEONLY%, OLE2_32%, OLE2_16%, OLE2AUTO_16%, OLE16RUNAPP%
  338.     UpdateSystemIni
  339.     '' Terminate if unhandled fatal error
  340.     IF ERR <> 0 THEN
  341.     GOTO QUIT
  342.     END IF
  343.  
  344.     IF OLEONLY% = 0 THEN
  345.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Win32s", "Setup", "1", cmoOverwrite
  346.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Win32s", "Version", szNewVer$, cmoOverwrite
  347.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Nls", "AnsiCP", "1252", cmoOverwrite
  348.     END IF
  349.     IF OLE2_32% = 1 THEN
  350.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "OLE", "Setup", "1", cmoOverwrite
  351.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "OLE", "Version", szOleNewVer, cmoOverwrite
  352.     END IF
  353.  
  354.     i% = DoMsgBox("Win32s files successfully installed.", "NeuroSolutions Setup", MB_OK+MB_TASKMODAL)
  355.     '' Indicate Win32s correctly copied and installed.
  356.     ExitCode% = EXITSUCCESS
  357.  
  358. FREECELL:
  359.     IF OLEONLY% = 1 THEN
  360.         GOTO QUIT
  361.     ENDIF
  362.     IF WIN32ENABLED% = 1 THEN
  363.         sz$ = UIStartDlg(CUIDLL$, FREECELLINSTNOWIN32S, "FInfoDlgProc",0, "")
  364.     ELSE
  365.         sz$ = UIStartDlg(CUIDLL$, FREECELLINST, "FInfoDlgProc",0, "")
  366.     END IF
  367.     UIPop 1
  368.     IF sz$ <> "CONTINUE" THEN
  369.         GOTO QUIT
  370.     END IF
  371.  
  372. GETFREEPATH:
  373.     DESTFREE$ = MID$(DESTSYS$,1,3) + "NS\"
  374.     SetSymbolValue "EditTextIn", DESTFREE$
  375.     SetSymbolValue "EditFocus", "END"
  376.  
  377. GETFREEPATHL1:
  378.     sz$ = UIStartDlg(CUIDLL$, FREECELLPATH, "FEditDlgProc", HELPFREECELL, HELPPROC$)
  379.  
  380.     IF sz$ = "CONTINUE" THEN
  381.         DESTFREE$ = GetSymbolValue("EditTextOut")
  382.  
  383.         IF MID$(DESTFREE$, LEN(DESTFREE$), 1) <> "\" THEN
  384.             DESTFREE$ = DESTFREE$ + "\"
  385.         END IF
  386.         ''Validate new path.
  387.         IF IsDirWritable(DESTFREE$) = 0 THEN
  388.             GOSUB BADPATH
  389.             GOTO GETFREEPATHL1
  390.         END IF
  391.         UIPop 1
  392.  
  393.         GOTO COPYFREECELL
  394.     ELSEIF sz$ = "REACTIVATE" THEN
  395.         GOTO GETFREEPATHL1
  396.     ELSEIF sz$ = "EXIT" THEN
  397.         UIPop 1
  398.         GOTO QUIT
  399.     END IF
  400.  
  401. COPYFREECELL:
  402.     ClearCopyList
  403.     CreateDir DESTFREE$, cmoNone
  404.  
  405.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  406.  
  407.     ERR = 0
  408.     AddSectionFilesToCopyList "Win32appNeuroSolutions", SrcDir$, DESTFREE$
  409.     CopyFilesInCopyList
  410.     '' If error copying NeuroSolutions, not a fatal error. Win32s is already installed.
  411.     IF ERR <> 0 THEN
  412.     ERR = 0
  413.     GOTO QUIT
  414.     END IF
  415.     ERR = 0
  416.  
  417.     IF DoesFileExist( DESTSYS$ + "WIN32S.INI", femExists ) THEN
  418.     CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "NeuroSolutions", "Setup", "1", cmoOverwrite
  419.     CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "NeuroSolutions", "Version", "2.0", cmoOverwrite
  420.     END IF
  421.  
  422.     ERR = 0
  423.     CreateProgmanGroup "NeuroSolutions", "", cmoNone
  424.     ShowProgmanGroup   "NeuroSolutions", 1, cmoNone
  425.     CreateProgmanItem  "NeuroSolutions", "NeuroSolutions", DESTFREE$ + "NS.EXE", "", cmoOverwrite
  426.     CreateProgmanItem  "NeuroSolutions", "Help", DESTFREE$ + "NS.HLP", "", cmoOverwrite
  427.     '' Only put up success dialog if icon added to group
  428.     IF ERR = 0 THEN
  429.     i% = DoMsgBox("NeuroSolutions was successfully installed.", "NeuroSolutions Setup", MB_OK+MB_TASKMODAL)
  430.     END IF
  431.     ERR = 0
  432.  
  433. QUIT:
  434.     '' Install error handler for final message box routines
  435.     ON ERROR GOTO ERRQUIT
  436.     IF ERR = 0 THEN
  437.         dlg% = ExitCode%
  438.     ELSEIF ERR = STFQUIT THEN
  439.         IF (OLE_PROTECT% = 1) THEN
  440.             '' Free all previously loaded libraries
  441.             FreeLibrary GetModuleHandle("compobj")
  442.             FreeLibrary GetModuleHandle("ole2")
  443.             FreeLibrary GetModuleHandle("ole2prox")
  444.             FreeLibrary GetModuleHandle("ole2conv")
  445.             FreeLibrary GetModuleHandle("storage")
  446.             FreeLibrary GetModuleHandle("ole2nls")
  447.             FreeLibrary GetModuleHandle("ole2disp")
  448.             FreeLibrary GetModuleHandle("typelib")
  449.         END IF
  450.         dlg% = EXITQUIT
  451.         ExitCode% = EXITQUIT
  452.     ELSE
  453.         dlg% = EXITFAILURE
  454.         ExitCode% = EXITQUIT
  455.     END IF
  456.  
  457. QUITL1:
  458.     IF WIN32ENABLED% = 1 THEN
  459.         UIPop 1
  460.         END
  461.     END IF
  462.  
  463.     sz$ = UIStartDlg(CUIDLL$, dlg%, "FInfo0DlgProc", 0, "")
  464.     IF sz$ = "REACTIVATE" THEN
  465.         GOTO QUITL1
  466.     END IF
  467.     UIPop 1
  468.  
  469.     IF ExitCode% = EXITSUCCESS THEN
  470.         IF RebootSystem(OLEONLY%) = 0 THEN
  471.             CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Win32s", "Setup", "0", cmoOverwrite
  472.             IF OLE2_32% = 1 THEN
  473.                 CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "OLE", "Setup", "0", cmoOverwrite
  474.             END IF
  475.             i% = DoMsgBox("Win32s is not properly configured and Win32s Setup must be run again.", "Unable to Restart Windows", MB_ICONEXCLAMATION+MB_OK+MB_TASKMODAL)
  476.         END IF
  477.     ENDIF
  478.  
  479.     END
  480.  
  481. '' Fatal error handler for error message routine
  482. ERRQUIT:
  483.     i% = DoMsgBox("Setup sources were corrupted!", "Setup Message", MB_OK+MB_TASKMODAL+MB_ICONHAND)
  484.     END
  485.  
  486. '' Bypass run-time errors. Let final dialog box display fatal error message.
  487. ERRNORMAL:
  488.     '' Check if user cancelled setup
  489.     IF ERR = STFQUIT THEN
  490.     GOTO QUIT
  491.     END IF
  492.     RESUME NEXT
  493.  
  494.  
  495. BADPATH:
  496.     sz$ = UIStartDlg(CUIDLL$, BADPATH, "FInfo0DlgProc", 0, "")
  497.     IF sz$ = "REACTIVATE" THEN
  498.     GOTO BADPATH
  499.     END IF
  500.     UIPop 1
  501.     RETURN
  502.  
  503.   ASKQUIT:
  504.     sz$ = UIStartDlg(CUIDLL$, ASKQUIT, "FQuitDlgProc", 0, "")
  505.  
  506.     IF sz$ = "EXIT" THEN
  507.     UIPopAll
  508.     ERROR STFQUIT
  509.     ELSEIF sz$ = "REACTIVATE" THEN
  510.     GOTO ASKQUIT
  511.     ELSE
  512.     UIPop 1
  513.     END IF
  514.     RETURN
  515.  
  516.  
  517.  
  518. '**
  519. '** Purpose:
  520. '**     Builds the copy list and performs all installation operations.
  521. '** Arguments:
  522. '**     none.
  523. '** Returns:
  524. '**     none.
  525. '*************************************************************************
  526. SUB Install(OLEONLY%, OLE2_32%, OLE2_16%, OLE2AUTO_16%, OLE16RUNAPP%) STATIC
  527.  
  528.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  529.  
  530.     '' Use file layout sections that specify OLDER file version/time check
  531.     IF OLEONLY% = 0 THEN
  532.         AddSectionFilesToCopyList "WindowsSystem", SrcDir$, DESTSYS$
  533.         AddSectionFilesToCopyList "WindowsSystemWin32s", SrcDir$, DESTSYS$ + "WIN32S\"
  534.         '' Add obsolete files to be removed
  535.         AddSectionFilesToCopyList "Win32sSystemObsoleteFiles", SrcDir$, DESTSYS$ + "WIN32S\"
  536.     END IF
  537.  
  538.     OLE_PROTECT% = 0
  539.     OLEINCLUDED% = DoesFileExist( GetSymbolValue("STF_SRCDIR") + "OLE2THK.DL_", femExists )
  540.     if OLEINCLUDED% = 1 THEN
  541.         IF (OLE2_16% = 1) OR (OLE2AUTO_16% = 1) THEN
  542.             IF OLE16RUNAPP% = 1 THEN
  543.                 '' Force all OLE2 DLLS to be copied during reboot.
  544.                 i% = SetErrorMode(-32768)
  545.                 i% = LoadLibrary(DESTSYS$ + "compobj.dll")
  546.                 i% = LoadLibrary(DESTSYS$ + "ole2.dll")
  547.                 i% = LoadLibrary(DESTSYS$ + "ole2prox.dll")
  548.                 i% = LoadLibrary(DESTSYS$ + "ole2conv.dll")
  549.                 i% = LoadLibrary(DESTSYS$ + "storage.dll")
  550.                 i% = LoadLibrary(DESTSYS$ + "ole2nls.dll")
  551.                 i% = LoadLibrary(DESTSYS$ + "ole2disp.dll")
  552.                 i% = LoadLibrary(DESTSYS$ + "typelib.dll")
  553.                 OLE_PROTECT% = 1
  554.             END IF
  555.             AddSectionFilesToCopyList "OleWindowsSystem", SrcDir$, DESTSYS$
  556.         END IF
  557.         IF OLE2_32% = 1 THEN
  558.             AddSectionFilesToCopyList "OleWindowsSystemWin32s", SrcDir$, DESTSYS$ + "WIN32S\"
  559.         END IF
  560.         IF (OLE2_16% = 1) OR (OLE2_32% = 1) OR (OLE2AUTO_16% = 1) THEN
  561.             AddSectionFilesToCopyList "Ole2RegWindowsSystem", SrcDir$, DESTSYS$
  562.         END IF
  563.         IF (OLE2AUTO_16% = 1) THEN
  564.             AddSectionFilesToCopyList "StdoleWindowsSystem", SrcDir$, DESTSYS$
  565.         END IF
  566.     END IF
  567.  
  568.     SetRestartDir GetWindowsDir()
  569.  
  570.     CopyFilesInCopyList
  571.  
  572.     IF (OLE_PROTECT% = 1) THEN
  573.         '' Free all previously loaded libraries
  574.         FreeLibrary GetModuleHandle("compobj")
  575.         FreeLibrary GetModuleHandle("ole2")
  576.         FreeLibrary GetModuleHandle("ole2prox")
  577.         FreeLibrary GetModuleHandle("ole2conv")
  578.         FreeLibrary GetModuleHandle("storage")
  579.         FreeLibrary GetModuleHandle("ole2nls")
  580.         FreeLibrary GetModuleHandle("ole2disp")
  581.         FreeLibrary GetModuleHandle("typelib")
  582.         OLE_PROTECT% = 0
  583.     END IF
  584.     IF OLEINCLUDED% AND (OLE2_16% OR OLE2_32% OR OLE2AUTO_16%) THEN
  585.         RUN "regedit /s " + DESTSYS$ + "ole2.reg"
  586.     END IF
  587.  
  588. END SUB
  589.  
  590. SUB UpdateSystemIni STATIC
  591.  
  592.     VxDPath$ = DEST32S$ + "W32S.386"
  593.     SystemIniPath$ = GetWindowsDir()
  594.  
  595.     t% = MakeSystemIni(SystemIniPath$, VxdPath$)
  596.  
  597. END SUB
  598.  
  599. FUNCTION RebootSystem(OLEONLY%) STATIC AS INTEGER
  600.  
  601. '   Check if any files were locked during install.  If the RestartList
  602. '   is not empty, ExitExecRestart() will restart Windows, cleanup setup
  603. '   files, and copy over locked files before Windows restarts.
  604.     i% = RestartListEmpty()
  605.     IF i% = 0 THEN
  606. '      ExitExecRestart() only returns if applications refuse to be shutdown.
  607. '      Win32s is installed but will not operate until Windows is restarted
  608. '      and the Win32s VxD is loaded.
  609.        i% = ExitExecRestart()
  610.        RebootSystem = 0
  611.     ELSE
  612. '      If the RestartList list is empty, it is necessary to restart windows
  613. '      directly.  The MSSETUP program creates _MSRSTRT.EXE and _MSSETUP.BAT
  614. '      in the restart directory.  This program should be exec'd to handle
  615. '      proper MSSETUP cleanup (temp files) and restart Windows.
  616.        IF (OLEONLY% = 1) THEN
  617.            RebootSystem = 1
  618.        ELSE
  619.            i% = ExitWindowsExec( GetWindowsDir() + "_MSRSTRT.EXE", "_MSSETUP.BAT" )
  620.            RebootSystem = 0
  621.        END IF
  622.     ENDIF
  623.  
  624. END FUNCTION
  625.  
  626.  
  627. '**
  628. '** Purpose:
  629. '**     Appends a file name to the end of a directory path,
  630. '**     inserting a backslash character as needed.
  631. '** Arguments:
  632. '**     szDir$  - full directory path (with optional ending "\")
  633. '**     szFile$ - filename to append to directory
  634. '** Returns:
  635. '**     Resulting fully qualified path name.
  636. '*************************************************************************
  637. FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING
  638.     IF szDir$ = "" THEN
  639.     MakePath = szFile$
  640.     ELSEIF szFile$ = "" THEN
  641.     MakePath = szDir$
  642.     ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
  643.     MakePath = szDir$ + szFile$
  644.     ELSE
  645.     MakePath = szDir$ + "\" + szFile$
  646.     END IF
  647. END FUNCTION
  648.